package com.nio;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @Author 咕唧
 * @Date 2022/7/5 19:38
 * @Version 1.0
 * nio序列化操作,把一个文件中的数据读取出来，存放到另外一个文件
 */
public class Nio03 {
    public static void main(String[] args) throws Exception {
        //创建一个存放数据的buffer
        ByteBuffer byteBuffer = ByteBuffer.allocate(30);

        //创建一个文件流
        FileInputStream fileInputStream = new FileInputStream("aa.txt");
        //转成nio的方式进行操作,channel可以将数据存放或者从buffer读取出来
        FileChannel fileInputStreamChannel = fileInputStream.getChannel();

        //目标文件
        FileOutputStream fileOutputStream = new FileOutputStream("bb.txt");
        FileChannel fileOutputStreamChannel = fileOutputStream.getChannel();

        while (true) {
            //不执行清理的话,因为上次循环读取过数据,最终position会等于limit,那下面再read的时候会认为没有空间,会返回0,并不是-1
            //下次循环仍旧如此,一直无限循环下去,导致文件大小急剧膨胀
            byteBuffer.clear();
            //如果没有上面的clear,这里会返回0,并不是返回-1,因为内部会认为byteBuffer没有空间了,position会等于limit,所以会跳过if,然后继续翻转buffer,再写到文件,因为会无限循环
            int read = fileInputStreamChannel.read(byteBuffer);
            if (read == -1) {
                break;
            }
            //翻转,写入到目标文件
            byteBuffer.flip();
            int write = fileOutputStreamChannel.write(byteBuffer);

        }
        //关闭流
        fileInputStream.close();
        fileOutputStream.close();
    }
}
